有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法在JRE 8中加载字体

我无法从JRE 8中的S3输入流加载字体。如果系统安装了JRE 7、JDK 7甚至JDK 8,我没有问题

val fontInputStream = s3Client.getObject(bucketName, objectKey).getObjectContent

val customFont = Font.createFont(Font.TRUETYPE_FONT, fontInputStream).deriveFont(Font.TRUETYPE_FONT, 20F)

我犯的错误是

Exception in thread "main" java.io.IOException: Problem reading font data.
        at java.awt.Font.createFont0(Font.java:1000)
        at java.awt.Font.createFont(Font.java:877)
        at Main$.delayedEndpoint$Main$1(Main.scala:31)
        at Main$delayedInit$body.apply(Main.scala:11)
        at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.collection.immutable.List.foreach(List.scala:381)
        at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
        at scala.App$class.main(App.scala:76)
        at Main$.main(Main.scala:11)
        at Main.main(Main.scala)

我试图将inputstream加载到一个临时文件,但没有帮助。我还试图直接从本地文件加载字体,但在获取字体元数据时遇到了另一个错误。这是错误日志

Exception in thread "main" java.lang.NullPointerException
        at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
        at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
        at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
        at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:776)
        at sun.font.SunFontManager$2.run(SunFontManager.java:431)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.SunFontManager.<init>(SunFontManager.java:376)
        at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
        at java.lang.Class.newInstance(Class.java:442)
        at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
        at java.awt.Font.<init>(Font.java:614)
        at java.awt.Font.createFont(Font.java:1056)
        at Main$.delayedEndpoint$Main$1(Main.scala:32)
        at Main$delayedInit$body.apply(Main.scala:11)
        at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.collection.immutable.List.foreach(List.scala:381)
        at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
        at scala.App$class.main(App.scala:76)
        at Main$.main(Main.scala:11)
        at Main.main(Main.scala)

因此,这不是inputstream的问题,而是JRE 8中字体本身的加载问题

这似乎是JRE 8字体中的一个错误

我正在加载用于在图片中绘制字符串的字体。 我的代码在Docker容器中运行,使用的图像有java:7-jre(ok)、java:7-jdk(ok)、java:8-jre(fail)、java:8-jdk(ok)


共 (6) 个答案

  1. # 1 楼答案

    我在openjdk中也遇到了同样的错误:8-jre-alpine。切换到openjdk:8-jre有帮助

    --- FROM openjdk:8-jre-alpine
    +++ FROM openjdk:8-jre
    
  2. # 2 楼答案

    在CentOS上,headless JRE缺少fontconfig依赖项:

    yum install fontconfig
    

    此外,可能还需要安装至少一种字体(dejavuliberation,等等)

  3. # 3 楼答案

    对于alpine和openjdk: 使用RUN apk --update add fontconfig ttf-dejavu 为我工作

  4. # 4 楼答案

    事实证明,这是openjdk-8-jre-headless安装的一个问题。这是java 8 JRE Docker镜像中的安装。我只需安装openjdk-8-jre(无头),问题就消失了

    如果查看错误日志,加载字体需要awt X11,JRE的headless版本中缺少awt X11

  5. # 5 楼答案

    我们在使用tomcat时也遇到了这个错误:8.0.38-jre8-alpine。该图像缺少fontconfig。 您也可以安装ttf-dejavu包,而不是切换到其他映像

    apk add --update ttf-dejavu
    
  6. # 6 楼答案

    对我来说,这个问题已经解决了:

    apt-get install -y libfontconfig1